package com.moon.moonclientsdk.client;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.moon.moonclientsdk.model.User;

import java.util.HashMap;
import java.util.Map;

import static com.moon.moonclientsdk.util.SignUtil.getSign;

public class MoonApiClient {

    //网关地址
    public static final String GATEWAY_HOST="http://localhost:8090";

    private final String accessKey;
    private final String secretKey;

    public MoonApiClient(String accessKey,String secretKey) {
        this.accessKey = accessKey;
        this.secretKey = secretKey;
    }

    public String getNameByGet(String name){
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("name", name);
        String result= HttpUtil.get(GATEWAY_HOST+"/api/name/get", paramMap);
        System.out.println(result);
        return result;
    }
    public String getNameByPost( String name){
        HashMap<String, Object> paramMap = new HashMap<>();
        paramMap.put("name", name);
        String result= HttpUtil.post(GATEWAY_HOST+"/api/name/post", paramMap);
        System.out.println(result);
        return result;
    }

    /**
     * 请求头参数map集合
     * <br>
     * 1、随机数nonce是一个在每次请求中都会变化的数值，确保了每个请求的唯一性。服务器会检查接收到的随机数是否已经使用过，以此来判断请求是否是重复的。<br>
     * 2、<font color="yellow">但随着请求量的增加，服务器需要存储大量的随机数，这可能会对服务器资源造成压力。因此，通常会结合时间戳来优化随机数的存储管理</font><br>
     * 3、timestamp 是请求的时间戳，表示请求发起的时间。服务器会检查时间戳是否在可接受的时间范围内，以此来判断请求是否过期。<br>
     * 4、<font color="orange">减少存储需求：通过设置一个合理的时间窗口，服务器可以只保留在这个时间窗口内的随机数，从而减少了对存储资源的需求</font><br>
     * 5、sign 是对请求参数和密钥进行加密后的签名，用于验证请求的完整性和合法性。服务器会根据接收到的参数和密钥重新计算签名，并与请求中的签名进行比较，以验证请求的合法性。<br>
     * @return
     */
    private Map<String, String> getHeaderMap(String body) {
        Map<String, String> hashMap = new HashMap<>();
        hashMap.put("accessKey", accessKey);
        //一定不能在服务器间传递
        //headers.put("secretKey", secretKey);
        hashMap.put("nonce", RandomUtil.randomNumbers(4));
        hashMap.put("body",body);
        hashMap.put("timestamp", String.valueOf(System.currentTimeMillis()/1000));
        hashMap.put("sign",getSign(body,secretKey));
        return hashMap;
    }



    /**
     * 设置ak\sk，使用构造函数在客户端中传入ak\sk参数，创建一个map集合将ak\sk放入，在请求头中放入参数map集合，然后发起请求调用的时候带上这个请求头
     * @param user
     * @return
     */
    public String getNameByBody( User user){
        String json = JSONUtil.toJsonStr(user);
        //TODO 接口URL地址写死了，需要优化
        HttpResponse httpResponse = HttpRequest.post(GATEWAY_HOST+"/api/name/user")
                .addHeaders(getHeaderMap(json))
                .body(json)
                .execute();
        System.out.println(httpResponse.getStatus());
        String result = httpResponse.body();
        System.out.println(result);
        return result;
    }
}
